package collection;

import com.sun.org.apache.xml.internal.utils.StringToStringTable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 *  JDk5推出时,推出了一个新特性:增强型for循环
 *  也称新循环,他可以用相同的语法遍历集合或数组.
 *
 *  新循环是java编译器认可的,并非虚拟机.
 */
public class NewForDemo {
    public static void main(String[] args) {
        String[] array = {"qwe","wer","ert","rty"};
        for (int i = 0;i < array.length;i++){
            String str = array[i];
            System.out.println(str);
        }
        /*
            新循环遍历数组就是普通for循环遍历,编译器编译后就会改为普通for循环
         */
        for (String str: array){
            System.out.println(str);
        }

        /*
         *  泛型 JDK5之后推出的另一个特性
         * 泛型也称为参数化类型,允许我们在使用一个类时指定它里面属性的类型,
         * 方法参数或返回值的类型,使得我们使用一个类时可以更灵活.
         * 泛型被广泛应用于集合中,用来指定集合中的元素类型.
         * 支持泛型的类在使用时如果未指定泛型,那么默认就是原型Object
         *
         *
         */
        Collection <String> c = new ArrayList<>();
        c.add("a");//编译器会检查add方法的实参是否为String类型
        c.add("c");
        c.add("w");
        c.add("qw");
        c.add("xc");
//        c.add(123);//编译不通过
        //迭代器遍历
        //迭代器也支持泛型,指定的与其遍历的集合指定的泛型一致
        Iterator <String> it = c.iterator();
        while (it.hasNext()){
            //编译器编译代码时会根据迭代器指定的泛型补充造型代码
            String str = it.next();//获取元素时无需再造型
            System.out.println(str);
        }
        /*
            新循环遍历集合就是迭代器遍历,编译器编译代码后会改为迭代器,
            因此不要在新循环遍历集合的过程中使用集合的方法增删元素.
         */
        //新循环遍历
        for (String str : c){
            System.out.println(str);
        }
    }
}
